import axios, {
  AxiosRequestConfig,
  AxiosResponse,
  InternalAxiosRequestConfig
} from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getToken } from '@/utils/auth'
import { useStore } from 'vuex'
import type { Store } from 'vuex'

// 创建一个store实例
const store: Store<any> = useStore()

// 定义状态码类型
type StatusCode = 400 | 401 | 403 | 404 | 500 | 502 | 503 | 504

// 错误消息映射
const errorMessages: Record<StatusCode, string> = {
  400: '请求参数有误，请检查输入',
  401: '登录状态已过期，请重新登录',
  403: '暂无权限访问',
  404: '请求的资源不存在',
  500: '服务器开小差了，请联系管理员',
  502: '网关错误，请稍后重试',
  503: '服务暂时不可用，请稍后重试',
  504: '网关超时，请检查网络'
}

// 记录最后一次错误消息和时间
let lastErrorMessage = ''
let lastErrorTime = 0
const ERROR_SHOW_INTERVAL = 2000 // 错误消息显示的最小间隔时间(ms)

// 显示错误消息的函数
export const showErrorMessage = (message: string) => {
  const now = Date.now()
  // 如果是相同消息且间隔小于指定时间，则不显示
  if (message === lastErrorMessage && (now - lastErrorTime) < ERROR_SHOW_INTERVAL) {
    return
  }
  lastErrorMessage = message
  lastErrorTime = now
  ElMessage({
    message,
    type: 'error',
    duration: 1000, // 显示2秒
    showClose: false // 关闭关闭按钮
  })
}

const service = axios.create({
  baseURL: '/api',
  timeout: 60000,  // 增加到 60 秒，因为 AI 响应可能需要较长时间
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    const token = getToken()
    if (token && config.headers) {
      config.headers['Authorization'] = token.startsWith('Bearer ') ? token : `Bearer ${token}`
    }
    return config
  },
  (error) => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    const res = response.data
    
    // 如果响应中包含code字段，则按照原有逻辑处理
    if (res.code !== undefined) {
      if (res.code !== 200) {
        // 显示错误信息
        showErrorMessage(res.msg || res.message || '操作失败')
        
        // 特定错误码处理
        if (res.code === 401) {
          // token 过期
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
        }
        
        return Promise.reject(new Error(res.msg || res.message || '操作失败'))
      }
    }
    
    // 如果响应中没有code字段，直接返回数据
    return res
  },
  (error) => {
    console.error('请求错误', error)
    const response = error.response
    const status = response?.status
    const message = response?.data?.msg || response?.data?.message || errorMessages[status as StatusCode] || '请求失败'
    showErrorMessage(message)
    return Promise.reject(error)
  }
)

export default service